(() => {


  // 1. 布尔值
  let isDone: boolean = false
  isDone = true
  // isDone = 2 // error

  // 2. 数字
  let a1: number = 10 // 十进制
  let a2: number = 0b1010  // 二进制
  let a3: number = 0o12 // 八进制
  let a4: number = 0xa // 十六进制

  // 3. 字符串
  let name: string = 'tom'
  name = 'jack'
  // name = 12  // error

  let age: number = 20

  let info: string = `我叫${name}, 今年${age}`
  console.log(info)

  // 4. undefined 和 null
  let u: undefined = undefined
  let n: null = null
  /* undefined和null类型的变量意义不大 */
  /* undefined和null是任意类型的子类型 */
  /* 在ts非严格模式下才可以, 在严格模式下会报错 */
  let s: string = null

  // 5. 数组
  let list1: number[] = [1, 3, 5]
  let list2: Array<number> = [3, 5, 7]

  // 6. 元组 Tuple
  /* 元组类型允许表示一个已知元素数量和类型的数组 */
  let ts: [string, number]
  ts = ['tom', 12]

  //  7. 枚举
  // enum 类型是对 JavaScript 标准数据类型的一个补充。 使用枚举类型可以为一组数值赋予友好的名字。
  enum Color {
    Red = 2,
    Green = 5,
    Blue = 7
  }
  let myColor: Color = Color.Red
  console.log(myColor, Color[myColor], Color, Color.Green)

  // 8. any
  let a: any = 'abc'
  a = 12
  a = {}
  let aa: any[] = [1, 'abc', true, {}]

  // 9. void
  /* void 类型像是与 any 类型相反，它表示没有任何类型 */
  function fn(): void {
    // return 3   // error
    // return undefined
    // return null
  }

  // 10. object
  function fn2(): object {
    // return 3 // error
    // return {}
    // return []
    return () => {}
  }
})()